{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 项目关键模块与 C++17 特性\n",
    "\n",
    "- **异步管线**：使用 `std::optional` 表示可缺失数据，`std::variant` 表示多态事件，`if constexpr` 优化模板分支。\n",
    "- **配置系统**：`std::filesystem` 处理路径，`std::string_view` 避免拷贝。\n",
    "- 选择原因：提高表达力、减少动态多态、改善性能。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 依赖管理与可重复构建\n",
    "\n",
    "- CMake + `FetchContent`/vcpkg，或 Bazel/Conan。\n",
    "- 锁定版本、使用 git submodule，CI 中重建缓存镜像，确保同一工具链（Docker/Devcontainer）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CI 集成\n",
    "\n",
    "- 流程：`cmake --build` → 单元测试（CTest/GoogleTest）→ 静态分析（clang-tidy）→ 格式化检查（clang-format --dry-run）→ Sanitizer 构建。\n",
    "- 通过 GitHub Actions/GitLab CI 编排。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **CI 分布式 ctest + 日志收集**\n",
    "\n",
    "- `ctest -j <N>` 并行；在 CD/CI 中拆分为多机器通过 `ctest --tests-regex`.\n",
    "- 失败时启用 `ctest --output-on-failure`，并收集 `core dump`（启用 `ulimit -c unlimited`，使用 `postmortem` 脚本上传 core & stack）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能瓶颈与分析工具\n",
    "\n",
    "- 使用 Linux `perf`, Intel VTune, Google gperftools。\n",
    "- 案例：发现线程池任务排队耗时→改为 work-stealing，减少锁竞争；或 SIMD 优化热路径。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## perf / gprof / VTune 基本流程\n",
    "\n",
    "- **perf**（Linux）：\n",
    "  1. `perf record ./app`\n",
    "  2. `perf report` 分析热点。\n",
    "- **gprof**：\n",
    "  1. 编译时加 `-pg`。\n",
    "  2. 运行生成 `gmon.out`，用 `gprof app gmon.out`.\n",
    "- **Intel VTune**：图形界面或 CLI，选择分析类型（Hotspots、Memory Access），运行收集并生成报告。\n",
    "\n",
    "| 工具                     | 主要用途                                                     | 常见平台 / 依赖                                         | 典型输出                                                 | 适合场景                                                    |\n",
    "| ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------- |\n",
    "| **perf**                 | Linux 内核自带的性能观测工具，可采集 CPU 采样、硬件事件（cache miss、分支预测）、上下文切换、锁竞争等 | Linux（需内核 perf_event 支持）                         | 火焰图原始数据、采样统计、硬件计数器、trace              | 分析 Linux 上的 CPU 占用、热点函数、内核/用户态混合性能问题 |\n",
    "| **gprof**                | GNU profiler，基于编译时插桩（`-pg`）统计函数调用次数与耗时  | 主要是 GNU 工具链（gcc/g++），需重新编译程序            | 调用图、函数级耗时、调用次数                             | 适合比较旧或简单的 CPU 时间分析，支持单线程/顺序程序        |\n",
    "| **Intel VTune Profiler** | 商业级性能分析工具，支持 CPU、内存、GPU、线程同步、缓存、向量化效率等深度分析 | Windows、Linux；配合 Intel CPU 最佳（但也支持其他 x86） | 图形界面报告：热点、并发度、内存带宽、向量化效率、I/O 等 | 高级分析、并行程序调优、深入硬件计数、线程/锁/NUMA 诊断     |\n",
    "\n",
    "简单理解：\n",
    "\n",
    "- **perf**：Linux 上功能全面的采样 profiler，可分析内核和用户态、硬件事件，非常灵活。\n",
    "- **gprof**：老牌 GNU 插桩 profiler，输出函数调用图，适合轻量级 CPU 时间分析，但对现代多线程/优化编译支持有限。\n",
    "- **VTune**：Intel 提供的可视化专业工具，能挖掘更底层、并行化、缓存/NUMA 等复杂性能问题，适合高要求调优。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码审查中的 C++17 误用\n",
    "\n",
    "- 滥用 `auto` 导致类型难读。\n",
    "- 误解 `std::move`（对 const 对象无效）。\n",
    "- 未考虑异常安全（缺少 `noexcept`/`strong guarantee`）。\n",
    "- 制定规范：编码指南、clang-tidy 配置、模板使用示例。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 确保异常安全与资源管理\n",
    "\n",
    "- 统一 RAII；资源用智能指针/包装器管理。\n",
    "- 例：数据库事务封装在类内，析构自动 rollback，成功路径需显式 commit。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 并发模块测试\n",
    "\n",
    "- 单元测试 + 伪随机任务（stress test）。\n",
    "- 使用 `std::barrier`/`latch` 控制调度；搭配 Sanitizer（TSan）检测数据竞争。\n",
    "- 夜间压力测试运行长时间随机负载。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 复杂 bug 解决流程\n",
    "\n",
    "- 例：跨线程竞态导致偶发崩溃。\n",
    "  1. 通过日志/TSan 复现。\n",
    "  2. 缩小到特定模块，添加断点 + `std::this_thread::get_id`。\n",
    "  3. 修复：引入分段锁 + 原子标志。\n",
    "  4. 添加回归测试，CI 中跑 sanitizer。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  静态分析工具\n",
    "\n",
    "- `clang-tidy`（开启 `modernize-*`, `performance-*`, `bugprone-*`）。\n",
    "- `cppcheck`、`include-what-you-use`；集成在 CI pipeline 中。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 跨编译器差异\n",
    "\n",
    "- 宏检测编译器版本，隔离特性差异（如 `[[likely]]`）。\n",
    "- 用统一封装（`compiler_warnings.cmake`）管理警告级别。\n",
    "- 在 CI 中同时构建 GCC/Clang/MSVC，确保可移植。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 推广现代 C++ 的阻力与解决\n",
    "\n",
    "- 阻力：历史代码、团队经验不足、编译器版本限制。\n",
    "- 方案：编写迁移指南、提供培训、引入 clang-tidy 自动修复、分阶段启用 C++17 特性\n",
    "- 先 `string_view`、再 `optional/variant`。\n",
    "- 将手写 `new/delete` 替换为 `std::unique_ptr` + `make_unique`，先提供示例与工具（clang-tidy `modernize-use-override`/`modernize-use-nullptr`）自动化改造等"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 在 CMake 中指定 C++17 标准与特性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cmake"
    }
   },
   "outputs": [],
   "source": [
    "cmake_minimum_required(VERSION 3.12)\n",
    "project(MyProj LANGUAGES CXX)\n",
    "\n",
    "set(CMAKE_CXX_STANDARD 17)\n",
    "set(CMAKE_CXX_STANDARD_REQUIRED ON)\n",
    "set(CMAKE_CXX_EXTENSIONS OFF)        # 使用纯标准语法\n",
    "\n",
    "add_library(core src/core.cpp)\n",
    "target_compile_features(core PUBLIC cxx_std_17)       # 明确依赖 C++17\n",
    "target_compile_features(core PRIVATE cxx_constexpr)   # 指定特定特性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`target_compile_features` 能在多目标工程中局部开启特性，避免全局污染。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# `-Wall -Wextra -pedantic -Werror`\n",
    "\n",
    "- `-Wall`: 常见警告。\n",
    "- `-Wextra`: 额外警告（未使用参数等）。\n",
    "- `-pedantic`: 强制严格遵循标准，对非标准扩展警告/报错。\n",
    "- `-Werror`: 将所有警告视为错误，确保清洁构建。\n",
    "   问题：不同编译器/平台产生的警告可能不同，导致 CI 失败；需建立 suppress 列表或使用 `-Werror` 仅在 CI。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 配置 LTO（链接时优化）\n",
    "\n",
    "GCC/Clang:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cmake"
    }
   },
   "outputs": [],
   "source": [
    "set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)  # CMake 3.9+"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "或添加 `-flto` 到编译和链接选项。MSVC 使用 `/GL` + `/LTCG`。\n",
    "\n",
    "影响：跨翻译单元优化、减小二进制/提高性能，但链接时间更长。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 预编译头（PCH）\n",
    "\n",
    "- 作用：将稳定、常用、巨大的头文件预先编译为二进制，后续编译复用，显著降低编译时间。\n",
    "- 使用（CMake 3.16+）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cmake"
    }
   },
   "outputs": [],
   "source": [
    "target_precompile_headers(core PRIVATE \"$<$<COMPILE_LANGUAGE:CXX>:pch.hpp>\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意：PCH 内容必须在所有源文件中一致包含；尽量只放稳定接口，避免频繁修改导致 PCH 重建。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  CCache / sccache\n",
    "\n",
    "- 工作原理：对编译命令 + 输入文件哈希生成缓存命中键；若命中，直接返回缓存产物（对象文件）。\n",
    "- 多平台 CI 价值：显著缩短增量构建时间，尤其在 pull request 内高频构建。sccache 支持远程缓存（S3/Redis），适合分布式集群。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RAII 性能计时器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "class ScopedTimer {\n",
    "public:\n",
    "    ScopedTimer(std::string name)\n",
    "        : name_(std::move(name)), start_(std::chrono::steady_clock::now()) {}\n",
    "    ~ScopedTimer() {\n",
    "        auto end = std::chrono::steady_clock::now();\n",
    "        auto ms = std::chrono::duration_cast<std::chrono::microseconds>(end - start_);\n",
    "        std::cout << name_ << \": \" << ms.count() << \"us\\n\";\n",
    "    }\n",
    "private:\n",
    "    std::string name_;\n",
    "    std::chrono::steady_clock::time_point start_;\n",
    "};"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Branch prediction 与 cache locality\n",
    "\n",
    "- 分支预测失败导致流水线清空，性能下降；应减少不可预测分支（数据驱动、位运算、`likely/unlikely` hint）。\n",
    "- 缓存局部性: 线性访问连续内存（如 `std::vector`）优于随机访问，避免 cache miss。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据局部性不足的识别与优化\n",
    "\n",
    "- 借助 perf 的 cache miss 指标或 VTune 的 memory access 分析。\n",
    "- 优化：Structure of Arrays (SoA) 替换 Array of Structures (AoS)；紧凑布局、分块处理、使用 `std::vector` + reserve。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# False sharing (伪共享)\n",
    "\n",
    "- 多线程写入不同变量但共享同一 cache line，导致无谓的缓存一致性流量。\n",
    "- 避免：填充对齐（`alignas(64)`）、将线程局部数据放入独立结构、使用 `std::pmr::monotonic_buffer_resource` 等。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lock contention / deadlock / livelock\n",
    "\n",
    "- **Lock contention**：多线程争夺同一锁 → 使用细粒度锁、读写锁、无锁结构。\n",
    "- **Deadlock**：互相等待 → 始终按同一顺序获取锁、使用 `std::scoped_lock` 同时加锁、超时检测。\n",
    "- **Livelock**：线程持续相互让步无法前进 → 增加入睡/随机退避策略。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Release 构建保留符号\n",
    "\n",
    "- GCC/Clang：`-O2 -g`，可调试；strip 时保留 separate debug info (`-gsplit-dwarf`)。\n",
    "- MSVC：`/O2 /Zi` + 生成 `.pdb`。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GCC / Clang / MSVC 差异\n",
    "\n",
    "- 标准支持步调不同，如 MSVC 早期对 `if constexpr` 支持滞后。\n",
    "- 链接器/ABI 差异导致某些模板实例名字变化。\n",
    "- 需在 CI 中并行测试多编译器。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 条件编译宏\n",
    "\n",
    "- `_MSC_VER`, `__GNUC__`, `__clang__` 等用于分支。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "#ifdef _MSC_VER\n",
    "#  define FORCE_INLINE __forceinline\n",
    "#else\n",
    "#  define FORCE_INLINE inline __attribute__((always_inline))\n",
    "#endif"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "风险：宏判断不准确、版本变化。应尽量封装在单独头文件。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Undefined Behavior\n",
    "\n",
    "- UB 表示标准未定义，编译器可以任意处理；不能依赖“恰好”行为。需要借助 sanitizers、静态分析避免。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  **ASan / MSan / TSan 适用问题？**\n",
    "\n",
    "- ASan：堆栈/全局越界、UAF、double free。\n",
    "- MSan：未初始化内存读（需 instrumented 依赖）。\n",
    "- TSan：数据竞争、原子顺序违规。三者可与 fuzz/CI 结合。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Endianness\n",
    "\n",
    "安全序列化/反序列化注意点\n",
    "\n",
    "- 大端 vs 小端决定字节序。\n",
    "- 明确字节序（`htonl/ntohl` 或统一 little-endian）。\n",
    "- 对齐：使用 `std::memcpy` 而非 `reinterpret_cast`，可通过 `#pragma pack` 或 protocol buffer。\n",
    "- 版本控制：在流中写入版本字段、保留扩展空间。\n",
    "- 校验长度/校验和，避免任意指针重建。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 避免头文件循环依赖 / Pimpl\n",
    "\n",
    "- 前向声明 + 分离实现。\n",
    "- Pimpl 优点：隐藏实现、减少编译依赖；缺点：额外动态分配、间接访问开销。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 控制模板/inline 编译时间\n",
    "\n",
    "- 仅在必要时模板化；将实现放在 `.ipp` 或分文件；使用模块化 build（预编译 header、Unity build）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 接口稳定性与 ABI 设计\n",
    "\n",
    "- 将 C++17 实现封装在 C ABI 层（extern \"C\"），暴露稳定函数集；内部结构可改动而不破 ABI。\n",
    "- 使用 versioning（`--version-script`）控制导出符号。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估第三方库\n",
    "\n",
    "- 检查许可证、维护活跃度、issue 响应、测试覆盖。\n",
    "- 运行静态分析、fuzz、ABI 检查；评估对 C++17 的兼容性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 迁移到 C++17 常见问题\n",
    "\n",
    "- 编译器版本过旧（需升级）。\n",
    "- 第三方库不支持 `std::string_view`/`filesystem` 等。\n",
    "- 链接问题：`std::filesystem` 需要额外链接（GCC 8 需 `-lstdc++fs`）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **C++ 与 Python/Java 互操作机制**\n",
    "\n",
    "- FFI：C API、`dlopen`/`ctypes`。\n",
    "- SWIG：自动生成多语言绑定。\n",
    "- pybind11：现代 C++ 封装 Python C API。\n",
    "- JNI/JCNI：Java ↔ C++。\n",
    "- gRPC/FlatBuffers 共享协议。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **C++ 暴露 REST/gRPC 服务的结构与线程模型**\n",
    "\n",
    "- 数据结构：DTO（`struct` + `std::optional`）、protobuf/FlatBuffers 生成类型。\n",
    "- 线程：reactor + thread pool（Asio、gRPC completion queue）；或每请求协程（Boost.Asio + stackless coroutine）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **测试框架自定义匹配器/断言**\n",
    "\n",
    "- GoogleTest：`MATCHER_P` 创建可读断言。\n",
    "- Catch2：`REQUIRE_THAT(value, WithinRel(expected, 0.01));` 或自定义 matcher class。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **模板/头文件库单元测试策略**\n",
    "\n",
    "- 提供最小组件库供测试（`libtests`），通过 `#include` 实例化测试类型。\n",
    "- 使用宏或 type list 生成多组测试，避免重复（如 `TYPED_TEST`）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Fuzz testing 流程（libFuzzer）**\n",
    "\n",
    "- 编写 `LLVMFuzzerTestOneInput`、启用 sanitizer、维护 corpus、最小化 crash 输入、将其纳入回归测试。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **覆盖率衡量（gcov/llvm-cov）**\n",
    "\n",
    "- 编译选项：`-fprofile-arcs -ftest-coverage`（gcov）或 `-fprofile-instr-generate -fcoverage-mapping`（llvm-cov）。\n",
    "- 运行测试→生成 `.gcda`，使用 `gcov`/`llvm-cov show`/`report` 输出行、函数覆盖率。可集成到 CI。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **第三方库 ABI 变动隔离与回退**\n",
    "\n",
    "- 通过 adapter 层封装；使用动态加载（`dlopen`）+ 版本检测。\n",
    "- 保留旧版本库并行安装，出现问题快速切换。\n",
    "- ABI Checker（`abi-compliance-checker`）预先检测。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **同时部署嵌入式与服务器端的抽象方式**\n",
    "\n",
    "- 抽象平台层（HAL）：IO、线程、内存；通过策略模式选择实现。\n",
    "- 编译配置：CMake toolchain 文件区分 target，使用 `#ifdef TARGET_EMBEDDED` 控制资源使用。\n",
    "- 限制内存/禁用异常的子集构建。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **C++17 代码嵌入 GPU (CUDA) 注意事项**\n",
    "\n",
    "- 部分标准库不可用（例如 RTTI、虚函数支持有限）。\n",
    "- 需要 `__host__ __device__` 修饰，避免使用异常和某些 STL 容器。\n",
    "- 可采用 Thrust 或自定义 `device_vector`。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **可扩展日志系统设计**\n",
    "\n",
    "- 多线程：无锁队列或 `pmr` ring buffer；\n",
    "- 结构化日志：JSON/Key-Value builder；\n",
    "- 异步输出：后台线程刷写，支持多 sink（文件、syslog、stdout）。\n",
    "- 提供 `spdlog`、`g3log` 等作为参考。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **可观测性埋点/指标输出**\n",
    "\n",
    "- 在关键路径使用计数器/直方图（Prometheus-cpp、statsd client）。\n",
    "- `std::chrono` 获取延迟；`std::atomic` 记录计数。\n",
    "- 以 RAII scope 记录耗时（指标 + tracing span）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **头文件膨胀的模块拆分策略**\n",
    "\n",
    "- 拆分接口层/实现层，使用 Pimpl 减少 include。\n",
    "- Modules（C++20）或 Unity build 分组；生成中间库（`libcore`, `libplatform`）。\n",
    "- 通过 IWYU（include-what-you-use）清理多余包含。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **跨平台图形/游戏引擎中 C++17 的统一性**\n",
    "\n",
    "- `std::filesystem` 管理资源路径；`std::optional` 描述可选输入。\n",
    "- `std::aligned_storage`/`std::byte` 管理 GPU 缓冲；`std::variant` 表达输入设备事件。\n",
    "- `pmr` 自定义分配器应对高频内存。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
